package com.changgou.pay.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.pay.service.WeiXinPayService;
import com.github.wxpay.sdk.WXPayUtil;
import entity.HttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName WeiXinServiceImpl
 * @Description
 * @Author Mr.L
 * @Date 17:18 2019/11/26
 * @Version 2.1
 **/
@Service
public class WeiXinPayServiceImpl implements WeiXinPayService {

    @Value("${weixin.appid}")
    private String appid;           // 微信公众账号或开放平台APP的唯一标识

    @Value("${weixin.partner}")
    private String partner;         // 商户号

    @Value("${weixin.partnerkey}")
    private String partnerkey;      // 商户密钥

    @Value("${weixin.notifyurl}")
    private String notifyurl;       // 回调地址

    /**
     * 生成支付订单二维码
     * @param money         支付金额
     * @return
     */
    @Override
    public Map<String, String> createNative(Map<String, String> money) {

        try {
            // 调用微信的支付接口：
            // 1、指定统一下单的接口地址
            String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            // 2、构建接口需要的参数：map
            Map<String, String> data = new HashMap<>();
            data.put("appid", appid);                               // 公众账号ID
            data.put("mch_id", partner);                            // 商户号
            data.put("nonce_str", WXPayUtil.generateNonceStr());    // 随机字符串
            data.put("body", "畅购118支付商品");                     // 商品描述
            data.put("out_trade_no", money.get("out_trade_no"));                   // 商户订单号
            data.put("total_fee", money.get("total_fee"));                           // 支付金额
            data.put("spbill_create_ip", "192.168.211.1");          // 终端IP
            data.put("notify_url", notifyurl);                      // 回调地址
            data.put("trade_type", "NATIVE");                       // 交易类型

            String username = money.get("username");                // 用户名
            String exchange = money.get("exchange");                // 交换机
            String routingKey = money.get("routingKey");            // 路由器
            Map<String, String> attachMap = new HashMap<>();
            attachMap.put("username",username);
            attachMap.put("exchange",exchange);
            attachMap.put("routingKey",routingKey);
            data.put("attach", JSON.toJSONString(attachMap));       // 附加数据


            // 将map转成xml并且进行签名
            String xmlParam = WXPayUtil.generateSignedXml(data, partnerkey);
            // 3、通过httpclient去调用
            HttpClient httpClient = new HttpClient(url);
            httpClient.setHttps(true);
            httpClient.setXmlParam(xmlParam);
            httpClient.post();
            // 4、获取响应的结果
            String strXML = httpClient.getContent();
            Map<String, String> map = WXPayUtil.xmlToMap(strXML);   // 将xml转程map
            map.put("out_trade_no", money.get("out_trade_no"));
            map.put("total_fee", money.get("total_fee"));
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 查询支付状态
     * @param outtradeno
     * @return
     */
    @Override
    public Map<String, String> queryPayStatus(String outtradeno) {
        try {
            // 调用微信的支付接口：查询订单接口
            // 1、提供查询订单的接口地址
            String url = "https://api.mch.weixin.qq.com/pay/orderquery";
            // 2、封装接口需要的数据
            Map<String, String> data = new HashMap<>();
            data.put("appid", appid);                               // 公众账号ID
            data.put("mch_id", partner);                            // 商户号
            data.put("out_trade_no", outtradeno);                   // 商户订单号
            data.put("nonce_str", WXPayUtil.generateNonceStr());    // 随机字符串
            // 将map转成xml并且进行签名
            String xmlParam = WXPayUtil.generateSignedXml(data, partnerkey);
            // 3、通过httpclient调用
            HttpClient httpClient = new HttpClient(url);
            httpClient.setHttps(true);
            httpClient.setXmlParam(xmlParam);
            httpClient.post();
            // 4、获取响应的结果
            String strXML = httpClient.getContent();
            Map<String, String> map = WXPayUtil.xmlToMap(strXML);
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 处理响应数据
        return null;
    }

    /**
     * 订单未支付，关闭订单
     * @param orderId
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, String> closePay(Long orderId) throws Exception {
        // 参数设置
        Map<String,String> paramMap = new HashMap<String,String>();
        paramMap.put("appid",appid);    // 应用ID
        paramMap.put("mch_id",partner); // 商户编号
        paramMap.put("nonce_str",WXPayUtil.generateNonceStr()); // 随机字符
        paramMap.put("out_trade_no",String.valueOf(orderId));   // 商户的唯一编号

        // 将Map数据转成XML字符
        String xmlParam = WXPayUtil.generateSignedXml(paramMap, partnerkey);

        // 确定url
        String url = "https://api.mch.weixin.qq.com/pay/closeorder";

        // 发送请求
        HttpClient httpClient = new HttpClient(url);

        // https
        httpClient.setHttps(true);
        // 提交参数
        httpClient.setXmlParam(xmlParam);

        // 提交
        httpClient.post();

        // 获取返回数据
        String content = httpClient.getContent();

        // 将返回数据解析程Map
        return WXPayUtil.xmlToMap(content);
    }


}
